package com.divemotor.ventarepuestosinternet.service.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.divemotor.ventarepuestosinternet.dao.UsuarioDAO;
import com.divemotor.ventarepuestosinternet.dao.VendedorDAO;
import com.divemotor.ventarepuestosinternet.exception.DivemotorBusinessException;
import com.divemotor.ventarepuestosinternet.model.Departamento;
import com.divemotor.ventarepuestosinternet.model.Distrito;
import com.divemotor.ventarepuestosinternet.model.Perfil;
import com.divemotor.ventarepuestosinternet.model.Provincia;
import com.divemotor.ventarepuestosinternet.model.Sucursal;
import com.divemotor.ventarepuestosinternet.model.Usuario;
import com.divemotor.ventarepuestosinternet.model.Vendedor;
import com.divemotor.ventarepuestosinternet.service.AdministradorService;
import com.divemotor.ventarepuestosinternet.service.SupervisorService;
import com.divemotor.ventarepuestosinternet.service.VendedorService;
import com.divemotor.ventarepuestosinternet.util.Constantes;
import com.divemotor.ventarepuestosinternet.util.DatosDeSession;
import com.divemotor.ventarepuestosinternet.util.Encriptacion;
import com.divemotor.ventarepuestosinternet.util.FechasUtil;

@Service(value="vendedorService")
@Transactional(rollbackFor=Exception.class)
public class VendedorServiceImpl implements VendedorService ,Serializable {

	private static final long serialVersionUID = -8904543381182892662L;

	@Autowired
	private VendedorDAO vendedorDAO;
	@Autowired
	private UsuarioDAO usuarioDAO;
	@Autowired
	private SupervisorService supervisorService;
	@Autowired
	private AdministradorService administradorService;

	@Override
	public Vendedor obtnerPorUsuario(Vendedor vendedor) throws DivemotorBusinessException {
		return vendedorDAO.obtnerPorUsuario(vendedor);
	}

	@Override
	public List<Vendedor> listarVendedores(Vendedor vendedor) throws DivemotorBusinessException {
		return vendedorDAO.listarVendedores(vendedor);
	}

	@Override
	public void insertar(Vendedor vendedor) throws DivemotorBusinessException {
		vendedor.setFechaCreacion(FechasUtil.obtenerFechaActual());
		vendedor.setUsuarioCreacion(DatosDeSession.obtenerUsuarioAutenticado());
		vendedor.getUsuario().setPais(DatosDeSession.obtenerPaisDelUsuarioAutenticado());
	    vendedor.getUsuario().setContrasenia(Encriptacion.encriptarMD5(vendedor.getUsuario().getContrasenia()));
		 
	    Usuario user = usuarioDAO.obtenerPorUsuarioLogin(vendedor.getUsuario());
	    
	    if(user!=null){
			 if(user.getListaPerfiles().size()==0){ 
				   user.setApellidos(vendedor.getUsuario().getApellidos());
				   user.setContrasenia(vendedor.getUsuario().getContrasenia());
				   user.setNombres(vendedor.getUsuario().getNombres());
				   user.setPais(vendedor.getUsuario().getPais());
				   user.setUsuario(vendedor.getUsuario().getUsuario());
				   user.setListaPerfiles(vendedor.getUsuario().getListaPerfiles());
				   vendedor.setUsuario(user);
				   vendedorDAO.insertar(vendedor);
				   usuarioDAO.actualizarUsuarioExistente(user);
			 }else{
				   user.setApellidos(vendedor.getUsuario().getApellidos());
				   user.setContrasenia(vendedor.getUsuario().getContrasenia());
				   user.setNombres(vendedor.getUsuario().getNombres());
				   user.setPais(vendedor.getUsuario().getPais());
				   user.setUsuario(vendedor.getUsuario().getUsuario());
				   List<Perfil> nuevaLista = user.getListaPerfiles();
				   nuevaLista.add(new Perfil(Constantes.ID_PERFIL_SUPERVISOR));
				   user.setListaPerfiles(nuevaLista);
				   vendedor.setUsuario(user);
				   vendedorDAO.insertar(vendedor);
				   usuarioDAO.actualizarUsuarioExistente(user);
			  }
	    }else{
	    	usuarioDAO.insertar(vendedor.getUsuario());
			vendedorDAO.insertar(vendedor);
				
	    }
	    
	}

	@Override
	public void actualizar(Vendedor vendedor) throws DivemotorBusinessException {
	    vendedor.setFechaModificacion(FechasUtil.obtenerFechaActual());
	    vendedor.setUsuarioModificacion(DatosDeSession.obtenerUsuarioAutenticado());
	    Usuario usu = usuarioDAO.obtenerListadePerfiles(vendedor.getUsuario());
	    vendedor.getUsuario().setListaPerfiles(usu.getListaPerfiles());
		usuarioDAO.actualizar(vendedor.getUsuario());
		vendedorDAO.actualizar(vendedor);
	}

	@Override
	public void eliminar(Vendedor vendedor) throws DivemotorBusinessException {
		vendedor.setFechaEliminacion(FechasUtil.obtenerFechaActual());
	    vendedor.setEstado(Constantes.ESTADO_ELIMINADO);
		vendedor.setUsuarioEliminacion(DatosDeSession.obtenerUsuarioAutenticado());
		List<Perfil> lsList = new ArrayList<Perfil>();
	    vendedor.getUsuario().setListaPerfiles(lsList);
		usuarioDAO.eliminar(vendedor.getUsuario());
		vendedorDAO.eliminar(vendedor);
	}

	@Override
	public List<Vendedor> listar() throws DivemotorBusinessException {
		return vendedorDAO.listar();
	}

	@Override
	public void eliminarPorUsuario(Usuario usuario) throws DivemotorBusinessException {
		Vendedor vendedor = obtenerPorIdUsuario(usuario);
		if(vendedor != null){
			vendedor.setEstado(Constantes.ESTADO_ELIMINADO);
			List<Perfil> perfiles = new ArrayList<Perfil>();
			vendedor.getUsuario().setListaPerfiles(perfiles);
			usuarioDAO.actualizarUsuarioExistente(vendedor.getUsuario());
			vendedor.setUsuarioEliminacion(DatosDeSession.obtenerUsuarioAutenticado());
			vendedor.setFechaEliminacion(FechasUtil.obtenerFechaActual());
			vendedorDAO.eliminarPorUsuario(vendedor);
		}
	}

	private Vendedor obtenerPorIdUsuario(Usuario usuario) {
		return vendedorDAO.obtenerPorIdUsuario(usuario);
	}

	@Override
	public void migrarUsuario(Integer tipoDeusuario, Vendedor vendedor) throws DivemotorBusinessException {
		Usuario user = usuarioDAO.obtenerListadePerfiles(vendedor.getUsuario());
		List<Perfil> lstPerfilesAntiguo  = user.getListaPerfiles();
		List<Perfil> lstNueva = new ArrayList<Perfil>();
		
		for (int i = 0; i < lstPerfilesAntiguo.size(); i++) {
			 if(!(lstPerfilesAntiguo.get(i).getIdPerfil().equals(tipoDeusuario))){
				 lstNueva.add(lstPerfilesAntiguo.get(i));
			  }
		}
		  
		lstNueva.add(new Perfil(Constantes.ID_PERFIL_VENDEDOR));
			
		vendedor.getUsuario().setListaPerfiles(lstNueva);
			
		administradorService.eliminarPorUsuario(vendedor.getUsuario());
		supervisorService.eliminarPorUsuario(vendedor.getUsuario());
		  
		vendedor.setUsuarioCreacion(DatosDeSession.obtenerUsuarioAutenticado());
		vendedor.setFechaCreacion(FechasUtil.obtenerFechaActual());
		vendedor.getUsuario().setPais(DatosDeSession.obtenerPaisDelUsuarioAutenticado());
		usuarioDAO.actualizarUsuarioExistente(vendedor.getUsuario()); 
		vendedorDAO.insertar(vendedor);	
	}

	@Override
	public List<Vendedor> buscar(Vendedor vendedor)
			throws DivemotorBusinessException {
		
		return vendedorDAO.buscar(vendedor);
	}

	@Override
	public Vendedor obtenerPorUsuario(Usuario user) throws DivemotorBusinessException {
		return vendedorDAO.obtenerPorIdUsuario(user);
	}

	@Override
	public List<Distrito> obtenerDistritosPorVendedor(Integer idprovincia) throws DivemotorBusinessException {
		return null;
	}

	@Override
	public List<Departamento> obtenerDepartamentosPorVendedor() throws DivemotorBusinessException {
		return null;
	}

	@Override
	public List<Provincia> obtenerProvinciasPorVendedor(Integer idDepartamento) throws DivemotorBusinessException {
		return null;
	}

	@Override
	public List<Sucursal> obtenerListaSucursales(Usuario obtenerUsuarioAutenticado) throws DivemotorBusinessException {
		return null;
	}

	@Override
	public List<Vendedor> listarVendedoresPorSupervisorAutenticado() throws DivemotorBusinessException {
		return vendedorDAO.listarVendedoresPorSupervisor(supervisorService.obtenerSupervisorAutenticado());
	}

}
